iT邦幫忙

2021 iThome 鐵人賽

DAY 19
1
自我挑戰組

資料分析及AI深度學習-簡單基礎實作系列 第 19

DAY19:學習率(上)

  • 分享至 

  • xImage
  •  

學習率(learning rate)

  • 學習率為控制模型中梯度下降的速度,也有人稱為步長。
  • 公式:新權重 = 舊權重 - 學習率 * 梯度
  • learning rate的設置很重要,一般大家都依照經驗去設置初始learning rate,0.01-0.001,但這也沒有一定哪個比較好,都得去嘗試。
  • 當learning rate設置過小時,會導致模型學習收斂較慢,且容易過擬合。而設置過大時,會容易導致模型學習過快,無法收斂,容易震盪甚至發散。如下圖。圖片來源:https://gino6178.medium.com/%E6%A8%A1%E5%9E%8B%E5%A3%93%E7%B8%AE%E5%8F%8A%E5%84%AA%E5%8C%96-learning-rate-c340a0b940e4
    圖片來源:https://blog.csdn.net/u012526436/article/details/90486021

固定學習率

  • 固定的learning rate會遇到甚麼問題呢?

    • 訓練到後期會發現收斂速度明顯變慢,且可能會卡在局部最小值,非全局最佳解。如下圖
        
      圖片來源:https://www.twblogs.net/a/5efe3eb9e53eaf40aa872468
  • 解決方法:用學習率衰退或者循環學習率。Pytorch有torch.optim.lr_scheduler套件可供來搭配優化器做使用,達到更好的效果。(優化器明天會提到)。


等間隔調整學習率:StepLR

  • 會依照你設定的step_size來調整學習率。

    torch.optim.lr_scheduler.StepLR(optimizer, step_size,      gamma=0.1, last_epoch=-1)
    
    • optimizer:選擇搭配的優化器。
    • step_size:學習率下降的間隔數,以epoch為單位。
    • gamma:若gamma=0.1,初始學習率=0.1,則過了step_size後的學習率會是學習率*0.1,以此類推。
    • last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
    • verbose:預設為False,若為True,則會印出當前學習率。

      圖片來源:https://www.jianshu.com/p/26a7dbc15246

多間隔調整學習率:MultiStepLR

  • 與StepLR不同在於,不是固定的step_size,可設定list,如第[10,30,60]個epoch調整學習率。

    torch.optim.lr_sheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)
    
    • optimizer:選擇搭配的優化器。
    • milestones:與stepLR不同於用list表示,而非固定的step_size,如[10,30,60]。
    • gamma:若gamma=0.1,初始學習率=0.1,則過了第10個epoch後的學習率會是學習率*0.1,以此類推。
    • last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
    • verbose:預設為False,若為True,則會印出當前學習率。

      圖片來源:https://www.jianshu.com/p/26a7dbc15246

指數衰減學習率:ExponentialLR

  • 學習率依指數型衰減,學習率衰減公式為lr = lr * (gamma^epoch)

    torch.optim.lr_sheduler.ExponentialLR(optimizer, gamma, last_epoch)
    
    • optimizer:選擇搭配的優化器。
    • gamma:假設為0.9,則每個epoch的學習率為0.9^epoch。
    • last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
    • verbose:預設為False,若為True,則會印出當前學習率。

      圖片來源:https://www.jianshu.com/p/26a7dbc15246

CosineAnnealingLR

  • 設置的最初始化及最小學習率,依照cosine週期衰減,直到T-max週期到了,又開始往上增加學習率。

    torch.optim.lr_sheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)
    
    • optimizer:選擇搭配的優化器。
    • T_max:一個cosine的週期,若設為8,即為第8個epoch的學習率會降至你設置的eta_min。然後再慢慢回到你設置的初始學習率。
    • eta_min:最小學習率。
    • last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
    • verbose:預設為False,若為True,則會印出當前學習率。

      圖片來源:https://zhuanlan.zhihu.com/p/261134624

CosineAnnealingWarmRestarts

  • 與CosineAnnealing相似,差別在於週期可設置,不會是固定的T-max。
 torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1, verbose=False)
  • optimizer:選擇搭配的優化器。
  • T_0:設置第一次回到初始學習率的epoch
  • T_mult:若設定為x,T_0設置為y,則回到初始學習率的週期會是第x^0 * y個epoch第[( x^0 )+( x^1 )] * y 個epoch第( x^0 )+ ( x^1 ) + ( x^2 ) * 5 個epoch,以此類推。
  • eta_min:最小學習率。
  • last_epoch:設置到哪個epoch就不再調整,預設為-1,到最後個epoch才會從初始學習率開始。
  • verbose:預設為False,若為True,則會印出當前學習率。

    圖片來源:https://zhuanlan.zhihu.com/p/261134624

ReduceLROnPlateau

  • 當某指標(例如loss或accuracy)沒在變化時,調整學習率。
torch.optim.lr_sheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10,
 verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)
  • optimizer:選擇搭配的優化器。
  • mode:設置min表示當監loss不再下降時更新學習率,max則是accuracy不再上升時更新學習率。
  • factor:當更新學習率時,lr = lr * factor。
  • patience:多少個epoch不變化時,開始更新學習率。
  • verbose:預設為False,若為True,則會印出當前學習率。
  • cooldown:當更新學習率後,等待多久個epoch再重啟監測。
  • min_lr:學習率下限。
  • eps:當學習率小於eps則不再更新學習率。
  • threshold_mode與threshold搭配使用,詳情見官網

今日小結

  • 設置學習率非常重要,學習率可能導致結果卡在局部最佳解,而不是全局最佳解,又或者卡在鞍點(明天會提到)。
  • 今天先跟各位介紹這幾個學習率衰減的方法。個人認為CosineAnnealingWarmRestarts以及CosineAnnealing可以算循環調整的學習率。
  • 明天跟各位介紹何謂鞍點以及循環學習率及自訂義學習率的調整。

上一篇
DAY18:激活函數
下一篇
DAY20:學習率(下)
系列文
資料分析及AI深度學習-簡單基礎實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言